[2026-01-22] Enhancing DDoS Attack Detection and Mitigation in SDN Using an Ensemble Online Machine Learning Model
๐ฆฅ ๋ณธ๋ฌธ
Motivation
๊ธฐ์กด์ offline-batch learning ๋ฐฉ์์ ํ๊ณ
- ์ ์ ํ์ต : ๊ณผ๊ฑฐ์ ๋ฐ์ดํฐ๋ก๋ง ํ์ต๋์ด ์์ด, Zero-day ๊ณต๊ฒฉ์ด๋ Low-DDoS ํจํด์ ์๋ณํ๊ธฐ ์ด๋ ค์
- Concept Drift ๋ฐ์ : ๋คํธ์ํฌ ํธ๋ํฝ์ ํต๊ณ์ ํน์ฑ์ด๋ ๊ณต๊ฒฉ ํจํด์ด ์๊ฐ์ ๋ฐ๋ผ ๋ณํ์ฌ ํ์ง ์ฑ๋ฅ ์ ํ
Challenge
- ์ค์๊ฐ ์ ์์ฑ : ๋์ ์ธ ๋คํธ์ํฌ ํธ๋ํฝ๊ณผ ์งํํ๋ ๊ณต๊ฒฉ์ ์ ์๋ ฅ์ด ํ์
- ํ์ง ์ฑ๋ฅ ์ ์ง : ์ค์๊ฐ์ผ๋ก ์ ์ํ๋ฉด์๋ ๋์ ์ฑ๋ฅ์ ์ ์ง
- ๋ฆฌ์์ค ์ ์ฝ ๋ด์ ์ต์ ํ : ์ ํ๋ ํ๋์จ์ด ์์ ๋ด์์ ์ค์๊ฐ ์ ์๊ณผ ํ์ง/์ํ๋ฅผ ์ํ
Background
Online machine learning
์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ผ๋ก๋ถํฐ์ ์ ์์ฑ๊ณผ ์ง์์ ์ธ ํ์ต. ๋ฐ์ดํฐ๋ฅผ ํ๊บผ๋ฒ์ ๋ชจ์์ ํ์ตํ๋ ๊ฒ์ด ์๋ ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ฌ ๋๋ง๋ค ์ ์ง์ ์ผ๋ก ์ ๋ฐ์ดํธ
-
vs Batch Learning

- Batch Learning : ์ ์ฒด ๋ฐ์ดํฐ ์ฝํผ์ค๋ฅผ ์ด์ฉํ์ฌ ํ๋ จ๋ ๋ชจ๋ธ์ด ์ถ๊ฐ์ ์ธ ํ์ต ์์ด ๋ฐฐํฌ๊ฐ ๋จ. ์ ๋ฐ์ดํธ๋ฅผ ํ๊ธฐ ์ํด์ ์ ์ ์ธ ์ํ๋ฅผ ์ ์ง. ๋ฐฉ๋ํ ์์ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ์ฝ์ผ๋ฏ๋ก ๋ง์ ์์์ ๊ธ๊ฒฉํ๊ฒ ์ฌ์ฉ
- OML : ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ๋ํ๋๋ ๊ฒฝ์ฐ๋ ๋ฐ์ดํฐ ๋ถํฌ๊ฐ ๋ณํ๋ ๊ฒฝ์ฐ, ๋ฏธ๋ ๋ฐฐ์น ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ํ์ตํ์ฌ ์ค์๊ฐ์ผ๋ก ๋ชจ๋ธ ๊ฐ์ค์น์ ๋ฐ์
Ensemble ML
๋จ์ผ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ ๋์ ์ฌ๋ฌ ๊ธฐ์ ํ์ต๊ธฐ๋ฅผ ๊ฒฐํฉํ์ฌ, ๊ฐ๋ณ ๋ชจ๋ธ์ด ๊ฐ์ง ์ฝ์ ์ ์ํธ ๋ณด์ํ๊ณ ๋ค์ํ๊ณ ์งํํ๋ DDoS ๊ณต๊ฒฉ์ ์ฒ๋ฆฌํ ์ ์๋ ์ ๋ขฐํ ์ ์๋ ํ์ง ๋ฉ์ปค๋์ฆ์ ์ ๊ณต
ARCHITECTURAL DESIGN

- ํธ๋ํฝ ์์ง๊ธฐ ๋ชจ๋: SDN ํ๊ฒฝ์์ ๋คํธ์ํฌ ํจํท์ ์บก์ฒํ๊ณ ๊ธฐ๋ก
- OML ๊ธฐ๋ฐ IDS: ๋จธ์ ๋ฌ๋ ๊ธฐ์ ์ ํ์ฉํ์ฌ ์ ์ ๋๋ ํธ๋ํฝ์ ์ค์๊ฐ์ผ๋ก ์ฒ๋ฆฌ ๋ฐ ๋ถ๋ฅํ๊ณ , ์ ์ฌ์ ์ธ DDoS ๊ณต๊ฒฉ์ ์๋ณ
- OML ๊ธฐ๋ฐ IPS : IDS๋ก๋ถํฐ ๋ฐ์ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์๋ณ๋ ์ํ์ ์ํํ๊ธฐ ์ํด ์กฐ์น
๋์ ํ๋ฆ
- ํธ๋ํฝ ์์ง : SDN ์ปจํธ๋กค๋ฌ์ ์ฐ๊ฒฐ๋ ํธ๋ํฝ ์์ง๊ธฐ๊ฐ ์์ง ์ค์์น๋ก๋ถํฐ ํธ๋ํฝ ๋ณต์ฌ. OpenFlow ์ค์์น์ ํ๋ก์ฐ ํ ์ด๋ธ์ ์ฃผ๊ธฐ์ ์ผ๋ก ํ๋ก์ฐ ์ํธ๋ฆฌ๋ฅผ ์์ฒญ
- ๋ณด์ ์ฑ๋์ ํตํ ์ ์ก : ์์ฒญ๊ณผ ์๋ต์ ๋ณด์์ด ์ ์ง๋๋ ๊ฒฉ๋ฆฌ๋ ์ฑ๋์ ํตํด ์ ์ก๋์ด ์ฐ๊ฒฐ๋ ํธ์คํธ์ ๋ ธ์ถ๋๋ ๊ฒ์ ๋ฐฉ์ง
- ๋ถ๋ฅ : ํ์ต๋ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ์ ์ฒ๋ฆฌ๋ ์ ๋ ฅ ํธ๋ํฝ์ ์์ฌ์ค๋ฝ๊ฑฐ๋ ์ ์์ ์ธ ๊ฒ์ผ๋ก ๋ถ๋ฅ
- ์ํ ๋ช ๋ น ์ ๋ฌ : IDS์ ๊ฒฐ์ ์ ์ฆ์ ์ํ ๋ชจ๋๋ก ์ ๋ฌ. IPS ์ ๋ต์ ๋ฐ๋ผ ์ ์ ํ ์กฐ์น๋ฅผ ๊ฒฐ์ .
- ๊ท์น ์ ์ฉ : ๊ฒฐ์ ๋ ์กฐ์น๋ฅผ ํ๋ก์ฐ ๊ท์น์ผ๋ก ๋ณํ. ์ค์์น์ ๊ตฌํ.
๋ชจ๋ํ ์ค๊ณ๋ฅผ ํตํด ๋ ๋ฆฝ์ ์ผ๋ก ์ต์ ํ ๊ฐ๋ฅ. ํน์ ์ปจํธ๋กค๋ฌ์ ์์กดํ์ง ์์
Traffic collector
ํธ๋ํฝ ์์ง๊ธฐ ๋ชจ๋์ ์ปจํธ๋กค๋ฌ ๋ด์์ ์๋. ํ๋ก์ฐ ํธ๋ํฝ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ณ ๋ฏธ๋ฌ๋ง. ํ๋ก์ฐ ํต๊ณ์ ๋ํ ์ฃผ๊ธฐ์ ์ธ ์์ฒญ
- ์๊ณ ๋ฆฌ์ฆ
- ์ด๊ธฐํ
- AddFlow
- ์ฐ์ ์์(priority), ๋งค์น(match), ์ก์ (actions) ์ค์
- flow_id ์์ฑ
- ๋งค์น ๋ฐ ์ก์ ํ์ฑ
- flows ๋์ ๋๋ฆฌ์ ํ๋ก์ฐ ์ถ๊ฐ
- flow_id๋ฅผ ํฌํจํ ํจํท ์์(packet out) ๋ฉ์์ง ์ ์ก
- GetFlows:
- flows ๋์ ๋๋ฆฌ ๋ฐํ
- UpdateFlowExpiration
- flow_expiration_timeout์ด ์กด์ฌํ๋ฉด, ์๋ก์ด flow_expiration_timeout์ ์ง๊ธ์ผ๋ก๋ถํฐ 30์ด ํ๋ก ์ค์
- ๊ทธ๋ ์ง ์์ผ๋ฉด, flow_expiration_timeout์ ํ์ฌ ์๊ฐ์ผ๋ก ์ค์
- CollectFlows
- flow_expiration_timeout์ด ์กด์ฌํ๊ณ ํ์ฌ ์๊ฐ์ด flow_expiration_timeout๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด
- flows ๋์ ๋๋ฆฌ์ ๊ฐ ํ๋ก์ฐ์ ๋ํด:
- ํ์ฌ ์๊ฐ๊ณผ ํ๋ก์ฐ์ [โexpiration_timeโ] ์ฐจ์ด๊ฐ 30์ด๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด: flows ๋์ ๋๋ฆฌ์์ ํด๋น ํ๋ก์ฐ๋ฅผ ์ ๊ฑฐ
- ํ๋ก์ฐ ๋ง๋ฃ ํ์์์ ์ ๋ฐ์ดํธ
- flow_expiration_timeout์ด ์กด์ฌํ๊ณ ํ์ฌ ์๊ฐ์ด flow_expiration_timeout๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด
- ์ฐ๊ฒฐ(connection) ๋ฐ table_id ์ธ์ ์ค์
- FlowCollector ์ธ์คํด์ค ์์ฑ
- ์ฐ์ ์์, ๋งค์น, ์ก์ ์ ํฌํจํ ํ๋ก์ฐ ์ํธ๋ฆฌ ์ถ๊ฐ
- 30์ด๋ง๋ค ํ๋ก์ฐ ์์ง
์ปจํธ๋กค๋ฌ ๋์ ์์
- ๊ฐ ์ค์์น์ ๋ํ ๊ณ ์ ID๋ฅผ ์์ฑํ์ฌ ์ฐ๊ฒฐ๋ ๋ชจ๋ OpenFlow ์ค์์น๋ฅผ ์ธ์ฆ
- OpenFlow ์ค์์น์ ํจํท์ด ๋์ฐฉํ ๋, ํจํท ํค๋๋ฅผ ์ค์์น์ ํ๋ก์ฐ ํ
์ด๋ธ์ ์๋ ํ๋ก์ฐ ์ํธ๋ฆฌ์ ๋์กฐ.
- ์ผ์นํ๋ฉด ๋ฐ์ดํธ ์์ ํจํท ์ ๋ฑ์ ์ ๋ณด๋ฅผ ํฌํจํ์ฌ ํด๋น ์ํธ๋ฆฌ์ ํต๊ณ๊ฐ ์ ๋ฐ์ดํธ
- ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ, ํด๋น ํจํท์ ์ปจํธ๋กค๋ฌ๋ก ์ ๋ฌ.
- ์ปจํธ๋กค๋ฌ๋ ์ ์๋ ์ ์ฑ ์ ์งํํ๊ธฐ ์ํด ์ค์์น์ ํ๋ก์ฐ ํ ์ด๋ธ์ ์๋ก์ด ํ๋ก์ฐ ์ํธ๋ฆฌ๋ฅผ ์ถ๊ฐ. ํน์ OpenFlow ์ค์์น์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ํธ์คํธ์์ ์์ฑ๋ ํธ๋ํฝ์ด ์ค์์น์ ํ๋ก์ฐ ํ ์ด๋ธ์ ์ฑ์
OML-based IDS
์์ธก๋ ฅ ํฅ์์ ์ํด ํ์ง ๋ชจ๋ธ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์ํ๊ฒ ์ ํ. ์ค์๊ฐ ์ ์์ฑ์ ์ํด ๋ฎ์ ๊ณ์ฐ ์ค๋ฒํค๋๋ฅผ ๊ฐ์ง ๋ถ๋ฅ๊ธฐ๋ค์ ์ฌ์ฉํจ.
- ๋ฐ์ดํฐ ์์ง ๋ฐ ์ ์ฒ๋ฆฌ : ์ ์ฒ๋ฆฌ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ผ๋ก์ ์ ์ฅ.
- ํน์ง ์ ํ ๋ฐ ์์ง๋์ด๋ง : ๋คํธ์ํฌ ํธ๋ํฝ ํน์ฑ์ ๋ฐ๋ผ ํน์ง ์ธํธ๋ฅผ ์ง์์ ์ผ๋ก ์กฐ์ ํ๋ ๋์ ํน์ง ์ ํ ๋ฉ์ปค๋์ฆ. ์ค์๊ฐ์ผ๋ก ๊ด๋ จ ํน์ง์ ์ ํํจ์ผ๋ก์จ ๋ชจ๋ธ์ ๊ณ์ฐ ๋ณต์ก์ฑ์ ์ต์ํํ๋ฉด์ ํ์ง ํจ๋ฅ์ ์ต์ ํ
- ๋ชจ๋ธ ์ด๊ธฐํ: ์จ๋ผ์ธ ๋จ๊ณ์์ ์ค์๊ฐ ์์ธก์ ์์ํ๊ธฐ ์ ์, ์คํ๋ผ์ธ ๋จ๊ณ ๋์ ์ด๊ธฐ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ์ด๊ธฐํ ๋ฐ ๊ธฐ์ ํ์ต๊ธฐ ํ์ต.
- ์์๋ธ ํ์ต: ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ๋์ฐฉํ๋ ๋๋ก ์์ธก์ ์์. ์์ธก์ ๊ฐ์ค์น ์กฐํฉ์ ํตํด ๊ฒฐํฉํ์ฌ ์ต์ข ์์ธก์ ๋์ถ
- ๊ณต๊ฒฉ ํ์ง : ์์๋ธ ๋ชจ๋ธ์ด ๋ค์ด์ค๋ ๋ฐ์ดํฐ์ ๋ํ ์์ธก. ์์ฌ์ค๋ฌ์ด ๋ฐ์ดํฐ๋ flagging.
- ๋ชจ๋ธ ๋ชจ๋ํฐ๋ง ๋ฐ ์ ๋ฐ์ดํธ : ๋๋ฆฌํํธ ํ์ง ๊ธฐ์ ๋ก ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋ง. ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ์ ์ ๋จ์ ๋ฐ๋ผ ์ฃผ๊ธฐ์ ์ผ๋ก ์ ๋ฐ์ดํธ
OML-BASED IPS
๊ธฐ๋ฅ
- ์ ์ ํ ๋์์ฑ ์งํ: ์ ์ฌ์ ์ํ์ด ์๋ณ๋๋ฉด IPS๋ ์ ์ฑ ํธ๋ํฝ ์ฐจ๋จ์ด๋ ์ง์ ๋ ์ฑํฌํ(sinkhole) ์ฐํ์ ๊ฐ์ ์ ์ ํ ๋์
- ์ง์์ ์ธ ํ์ต ๋ฐ ์ ์: IPS๋ ์ง์์ ์ผ๋ก ์งํํ๋ฉฐ ๋ณํํ๋ ํธ๋ํฝ ํจํด๊ณผ ์๋ก ๋ฑ์ฅํ๋ ๊ณต๊ฒฉ ๊ธฐ์ ์ ๋ง์ถฐ ์กฐ์ .
ํ๋ ์ ์ํฌ
- ํธ๋ํฝ ํ๋กํ์ผ๋ง: ์ด ๋จ๊ณ์์๋ ์ค์๊ฐ์ผ๋ก ๋คํธ์ํฌ ํธ๋ํฝ์ ๋ถ์ํ๊ณ ํ๋กํ์ผ๋งํ์ฌ ๊ณต๊ฒฉ์ ์งํ๋ ๋น์ ์์ ์ธ ํจํด์ ์ ํํ ์ฐพ์
- ์กฐ์น ๋ฉ์ปค๋์ฆ ์ค๊ณ: ์ํ ํ์ง ์ ์ฑํํ ์ ์ ํ ์กฐ์น์ ๋์์ฑ ์ ์ค๊ณ
- ์กฐ์น ๊ตฌํ: IPS๋ ๊ณต๊ฒฉ์ด ์ฑ๊ณตํ๋ ๊ฒ์ ๋ง๊ธฐ ์ํด ์ ์ฑ ํธ๋ํฝ ์ฐจ๋จ์ด๋ ๋ฆฌ๋๋ ์ ๊ณผ ๊ฐ์ ์ง์ ๋ ์กฐ์น๋ฅผ ์คํ
- ๋ชจ๋ธ ๋ชจ๋ํฐ๋ง ๋ฐ ์ ๋ฐ์ดํธ: ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ์ ๋ฐ์ดํธ
Evaluation
- Setup : ์์ฒด ์์ฑ ๋ฐ์ดํฐ์
๊ณผ ๊ธฐ์กด์ ๋ฒค์น๋งํฌ ๋ฐ์ดํฐ์
์์ ๋ชจ๋ธ ํ๊ฐ
- LDDoS/DDoS ๊ณต๊ฒฉ์ ํฌํจํ์ฌ ์์ฒด ์์ฑ๋ ๋ฐ์ดํฐ์ ์ ๋น๋กฏํ ๋ค์ํ ๋ฐ์ดํฐ์ ์์ ํ๊ฐ.
- Mininet ๋ฐ Ryu SDN ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ iperf, Hping3, Scapy์ ๊ฐ์ ๋๊ตฌ๋ก DDoS ๊ณต๊ฒฉ์ ์๋ฎฌ๋ ์ด์ .
- CICIDS2019, InSDN, slow-read-DDoS-attack-in-SDN๊ณผ ๊ฐ์ ๋ฒค์น๋งํฌ ๋ฐ์ดํฐ์ ์์ ๋ชจ๋ธ์ ํ๊ฐ
-
Environment

-
network topology

-
Dataset : ์ง์ ์๊ฐ, IP ํ๋กํ ์ฝ, ๋ฐ์ดํธ ์, ํจํท ์, SYN ํ๋๊ทธ ์นด์ดํธ ๋ฑ์ ํฌํจํ 22๊ฐ์ feature ์ค Chi2 ํน์ง ์ ํ์ ํตํด 14๊ฐ๋ก ์ถ์

- ์ข
๋ฅ
- ํจํท ๊ธฐ๋ฐ ์์ฑ: ์๋ฐฉํฅ ๋ฐ ์ญ๋ฐฉํฅ ๋ชจ๋์ ์ด ํจํท ์์ ๊ฐ์ ํจํท์ ๋ํ ์ธ๋ถ ์ ๋ณด
- ๋คํธ์ํฌ ์๋ณ์ ์์ฑ: IP ์ฃผ์, ํฌํธ ๋ฒํธ, ํ๋กํ ์ฝ ์ ํ ๋ฑ ์์ค ๋ฐ ๋ชฉ์ ์ง ํ๋ก์ฐ๋ฅผ ์ ์ํ๋ ๊ณตํต ์ ๋ณด
- ์๋ธ ํ๋ก์ฐ ๊ธฐ์ ์ ์์ฑ: ์๋ฐฉํฅ ๋ฐ ์ญ๋ฐฉํฅ ๋ชจ๋์์์ ํจํท ๋ฐ ๋ฐ์ดํธ ์์ ๊ฐ์ด ์๋ธ ํ๋ก์ฐ์ ๊ด๋ จ๋ ์ ๋ณด
- ๋์ฐฉ ๊ฐ ์๊ฐ ์์ฑ: ์๋ฐฉํฅ ๋ฐ ์ญ๋ฐฉํฅ ๋ชจ๋์์์ ํจํท ๋์ฐฉ ๊ฐ ์๊ฐ์ ๊ดํ ์ ๋ณด
- ๋ฐ์ดํธ ๊ธฐ๋ฐ ์์ฑ: ๋ฐ์ดํธ ํน์ ๋ฐ์ดํฐ์ ๊ด๋ จ๋ ๊ฒ์ผ๋ก, ์๋ฐฉํฅ ๋ฐ ์ญ๋ฐฉํฅ ๋ชจ๋์์ ์ ์ก๋ ์ด ๋ฐ์ดํธ ์
- ํ๋ก์ฐ ํ์ด๋จธ ์์ฑ: ํ์ฑ ๋ฐ ๋นํ์ฑ ๊ธฐ๊ฐ์ ํฌํจํ์ฌ ๊ฐ ํ๋ก์ฐ์ ์ง์ ์๊ฐ์ ๊ดํ ์ ๋ณด
- ํ๋ก์ฐ ๊ธฐ์ ์ ์์ฑ: ์๋ฐฉํฅ ๋ฐ ์ญ๋ฐฉํฅ ๋ชจ๋์์์ ํจํท ๋ฐ ๋ฐ์ดํธ ์์ ๊ฐ์ ํธ๋ํฝ ํ๋ก์ฐ ์ธ๋ถ ์ ๋ณด
- ํ๋๊ทธ ์์ฑ: SYN ํ๋๊ทธ, RST ํ๋๊ทธ, Push ํ๋๊ทธ ๋ฑ๊ณผ ๊ฐ์ ํ๋๊ทธ ๊ด๋ จ ์ ๋ณด

Chi2 ํน์ง ์ ํ์ ํตํด ๊ฐ์ฅ ๋์ ํน์ง๋ง์ ์ ํํ์ฌ ๋ฐ์ดํฐ ์ฐจ์์ 14๊ฐ๋ก ์ถ์
- ์ข
๋ฅ
- Result
-
์์ฒด ๋ฐ์ดํฐ์
Accuracy Precision Recall F1 Score ์คํ์จ 0.9926 0.9910 0.9962 0.981 0.025 -
๋ฒค์น๋งํฌ ๋ฐ์ดํฐ์

-
์๋ต ์๊ฐ

-
Contribution & Discussion
- SDN ํ๊ฒฝ์์ ์ ๋ก ๋ฐ์ด, ๊ณ ์ ๋ฐ ์ ์ ๊ณต๊ฒฉ์ ํฌํจํ์ฌ ์งํํ๋ DDoS ๊ณต๊ฒฉ์ ํ์ง/์ํํ๊ธฐ ์ํด ์ค๊ณ๋ ์์๋ธ ์จ๋ผ์ธ ML ๋ชจ๋ธ
- ์ง์์ ์ธ ์ ๋ฐ์ดํธ๋ฅผ ํตํด ์ญ๋์ ์ธ DDoS ์งํ์์ ๋ชจ๋ธ์ ์ ์์ฑ๊ณผ ํ๋ณต๋ ฅ์ ํฅ์
โ ์ค์ ์ฉ ์ northbound ํต์ ์ ๋ณ๋ชฉ ํ์ ๋ฌธ์
Leave a comment